*******************************************************************************
**********             The easiest way to use libnormaliz            **********
*******************************************************************************

This is an early version of what will be a library for normaliz in a future version.
It may very well happen that the interface changes! Please contact us if you want to use the normaliz library.

More information on normaliz:
http://www.mathematik.uni-osnabrueck.de/normaliz/

Preperation:

Check the configuration in the Makefile.configuration in the Normaliz source directory.
Compile the normaliz library via a make in the libnormaliz directory. To compile a strictly serial version use "make OPENMP=no". 

To use libnormaliz link libnormaliz.a in. It might be necessary to activate compilation  with OpenMP (in g++ use the -fopenmp flag).


Quick workflow overview:

1) include libnormaliz/Cone.h in your source code
2) create a libnormaliz::Cone object
3) call one of the Cone.compute() methods
4) check if the desired data is computed: isComputed( X )
5) get the data: getX()
6) repeat 4+5 or 3+4+5


Example:

// we discourage the use of "using namespace libnormaliz", but you may find these useful
using libnormaliz::Cone;
using libnormaliz::ConeProperty;
using libnormaliz::ConeProperties;


// use your preferred integer type
typedef long long int Integer;
//typedef mpz_class Integer;   //if you need more than 64bit integers

// get some input data
vector< vector <Integer> > Data = ...
libnormaliz::InputType type = integral_closure; // for all input types see below
libnormaliz::Cone<Integer> MyCone = libnormaliz::Cone<Integer>(Data, type);

libnormaliz::ConeProperties Wanted();
Wanted.set(libnormaliz::ConeProperty::Triangulation).set(libnormaliz::ConeProperty::HilbertBasis);
MyCone.compute(Wanted);

// alternativ way to say what you want, see libnormaliz.h
//libnormaliz Mode computation_mode = hilbertBasisTriangulation
//MyCone.compute(computation_type);


if(MyCone.isComputed(libnormaliz::ConeProperty::HilbertBasis)) {
	vector< vector< Integer> > HB& = MyCone.getHilbertBasis();
	//use it
}
if(MyCone.isComputed(libnormaliz::ConeProperty::Multiplicity)) {
   cout << "MyCone has multiplicity " << MyCone.getMultiplicity();
}

input types (from libnormaliz.h):
integral_closure
normalization
polytope
rees_algebra
hyperplanes
equations
congruences
lattice_ideal
grading
signs

to combine input types build a 
std::map <libnormaliz::InputType, vector< vector<Integer> >
and construct the libnormaliz::Cone from it

Please see the Normaliz Documentation for more information on the input types and computation modes
http://www.mathematik.uni-osnabrueck.de/normaliz/Normaliz2.9Documentation.pdf



Alternative Configuration

The integer type in the libnormaliz library is templated. So in theory it is possible to use other integer types. Then you have to include libnormaliz-all.cpp. We suggest (and only tested) 'long long int' and the gmp type 'mpz_class'.
In this case you do not need to link libnormaliz.a
